package sdk;


import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import com.alibaba.fastjson.JSON;

/**
 * 代理请求工具类 (自建代理 java服务-请求转发服务)
 *
 * @author 王松
 * @mail 1720696548@qq.com
 * @date 2025/5/15 9:20
 */
public class XjProxyUtil {
    /**
     * 代理地址
     */
    final static String PROXY_URL = "http://127.0.0.1:8023/proxy";

    /**
     * 发起请求
     * 当前请求的超时时间 Timeout 和 代理服务超时时间 Timeout  使用相同的时间
     *
     * @param dto     请求参数
     * @param isProxy 是否使用代理
     * @return code=200 请求成功  code !=200 请求失败
     */
    public static XjHttpRequestResult request(XjHttpRequest dto, boolean isProxy) {
        if (isProxy) {
            return requestProxy(dto);
        } else {
            // 不使用代理
            return requestNoProxy(dto);
        }
    }

    /**
     * 使用代理请求
     *
     * @param dto
     * @return
     */
    private static XjHttpRequestResult requestProxy(XjHttpRequest dto) {
        try {
            HttpResponse httpResponse = HttpRequest.post(PROXY_URL)
                    .body(JSON.toJSONString(dto))
                    .timeout(dto.getTimeout()).execute();
            if (httpResponse.isOk()) {
                XjHttpRequestResult proxyResult = JSON.parseObject(httpResponse.body(), XjHttpRequestResult.class);
                if (proxyResult.getCode().equals(200)) {
                    return XjHttpRequestResult.success(proxyResult.getData());
                } else {
                    return XjHttpRequestResult.fail(proxyResult.getCode(), httpResponse.body());
                }
            }
            return XjHttpRequestResult.fail(httpResponse.getStatus(), httpResponse.body());
        } catch (Exception e) {
            // 请求失败
            return XjHttpRequestResult.fail(500, e.getMessage());
        }
    }


    /**
     * 不所有代理
     *
     * @param dto
     * @return
     */
    private static XjHttpRequestResult requestNoProxy(XjHttpRequest dto) {
        try {
            HttpResponse httpResponse = HttpRequest.get(dto.getUrl())
                    .setMethod(dto.getMethod())
                    .setFollowRedirects(true)
                    .timeout(dto.getTimeout() != null ? dto.getTimeout() : 30 * 1000)
                    .form(dto.getForm() != null ? dto.getForm() : null)
                    .body(dto.getBody() != null ? dto.getBody() : null)
                    .headerMap(dto.getHeaders() != null ? dto.getHeaders() : null, true)
                    .execute();
            if (httpResponse.isOk()) {
                return XjHttpRequestResult.success(httpResponse.body());
            } else {
                return XjHttpRequestResult.fail(httpResponse.getStatus(), httpResponse.body());
            }
        } catch (Exception e) {
            // 请求失败
            return XjHttpRequestResult.fail(500, e.getMessage());
        }
    }
}
